import { type Dayjs } from 'dayjs'
import { makeHTTPSAvatar } from '@/lib/https'

export const LOAD_INTERVAL = 60 * 1000 // 每隔多久重新从后端拉取一次企业微信列表

export const PREPARING = 60 * 1000 // 新登录的企业微信的准备时长（设为1分钟是因为后端接口要1分钟才能保证加载到联系人数据）
export const DESTROY_BLOCKING = 5 * 1000 // 移除企业微信（销毁容器）后的屏蔽期
export const LOGOUT_BLOCKING = 5 * 1000 // 企业微信因操作退出后的屏蔽期

// 企业微信状态
export enum Status {
  Preparing = 1, // 新登录企业微信准备中
  Normal = 2, // 正常
  Destroying = 3, // 手动移除企业微信（销毁容器）后的屏蔽期
  LoggingOut = 4, // 企业微信正常退出（如切换账号或移动端退出）后的屏蔽期
  Removed = 6, // 企业微信已彻底移除
}
export type TimingStatus = Status.Preparing | Status.Destroying | Status.LoggingOut // 有时效的状态（过一定时间后状态会改变）
export type NoTimingStatus = Exclude<Status, TimingStatus> // 没有时效的状态
export type RunningStatus = Status.Normal | Status.Preparing // 企业微信应尚在运行的状态（至少是期待其正在运行）

export const timingStatus = new Set([Status.Preparing, Status.Destroying, Status.LoggingOut])
export const runningStatus = new Set([Status.Normal, Status.Preparing])

/**
 * 企业微信相关事件
 *
 * blocked      企业微信的主体不在登录白名单中，不允许登录
 * found        识别到新的企业微信（无论最终会以什么状态对其初始化）
 * preparing    企业微信准备中
 * prepared     企业微信准备完成（有可能在 found 后立即被触发）
 * destroying   已手动移除企业微信
 * loggingOut   企业微信正常退出（如切换账号或移动端退出）
 * removed      企业微信已彻底移除
 */
export interface Event {
  type: 'blocked' | 'found' | 'preparing' | 'prepared' | 'destroying' | 'loggingOut' | 'removed'
  info: QywxInfo
}

/**
 * 整理后的容器报错（包括 Hook 层报错）通知内容
 */
export interface QywxNotice {
  wxid: string | null
  hostname: string
  title: string
  content: string
}

// 企业微信信息，包含企业微信状态
export interface QywxStatusInfo extends QywxInfo {
  status: Exclude<Status, Status.Removed> // removed 的企业微信直接移除，不存在 info
}

// 人员信息
export interface RawContact {
  avatar: string
  conversation_id: string
  desc: string
  position: string
  nickname?: string
  realname: string
  remark: string
  sex: 1 | 2
  user_id: string
  username: string
}
export type RawQywxInfo = RawContact & {
  account: string
  acctid: string
  corp_id: string
  corp_name?: string
  corp_short_name?: string
  email: string
  job_name: string
  mobile: string
}
export interface QywxBaseInfo {
  wxid: string
  hostname: string // 对应的容器
  username: string // 实际用户名
  nickname: string // 设置的昵称
  avatar: string
  corpid: string
  corpname: string // 企业名称
  acctid: string // 此企业微信的名称化的 id（如 AnJianShi），与企业微信接口交互时会用到
}
export interface QywxInfo extends QywxBaseInfo {
  accountId: string // 企微所属的平台账号 ID
  friendlyName: string // 经过格式化，适合显示给用户看的名称
  friendlyFullName: string // 在 friendlyName 基础上添加了企业名
}

export function formatQywxInfo(accountId: string, hostname: string, raw: RawQywxInfo): QywxInfo {
  const base: QywxBaseInfo = {
    wxid: raw.user_id,
    hostname,
    username: raw.username || raw.acctid,
    nickname: raw.nickname ?? '',
    avatar: makeHTTPSAvatar(raw.avatar),
    corpid: raw.corp_id,
    corpname: raw.corp_short_name ?? raw.corp_name ?? '',
    acctid: raw.acctid,
  }
  return {
    ...base,
    accountId,
    friendlyName: friendlyQywxName(base, false),
    friendlyFullName: friendlyQywxName(base),
  }
}

/**
 * 返回终端用户友善的企业微信名称
 */
export function friendlyQywxName(
  qywx?: Pick<QywxBaseInfo, 'username' | 'nickname' | 'corpname'>,
  withCorp = true,
) {
  if (!qywx) return ''
  const { username, nickname, corpname } = qywx
  let name = `${username}${nickname ? `(${nickname})` : ''}`
  if (withCorp && corpname) name += `-${corpname}`
  return name
}

/**
 * 特定账号下登录了的企业微信信息
 * （此为站在整个系统层面处理企业微信，和上面站在单个账号的视角有不同）
 */
export enum AccountQywxStatus {
  Online = 0, // 在线
  Offline = 1, // 离线（相当于“休眠”）
  LoggedOut = 2, // 登出（相当于“关机”）
  LoggingIn = 3, // 正在登录
  LoginFailed = 4, // 登录失败，需重新扫码
  CannotLogin = 5, // 登录失败，需联系技术人员解决
}

export interface RespAccountQywx {
  hostname: string
  user_id: string
  wx_id: string
  avatar: string
  corp_id: string
  corp_name: string
  corp_short_name: string
  job_name: string
  mobile: string
  nickname: string
  position: string
  username: string
  acctid: string
  sex: number
  account: string
  user_account_name: string | null
  user_account_remark_name?: string | null
  QrCode: string | null
  Status: AccountQywxStatus
}

export interface AccountQywx extends QywxInfo {
  accountId: string
  accountName: string
  status: AccountQywxStatus
  qrcode: string | null // 用于“恢复登录”的二维码，仅在 status 为 LoginFailed 时有值
}

export function formatAccountQywx(raw: RespAccountQywx): AccountQywx {
  // 格式化参考 formatQywxInfo()
  const base: QywxBaseInfo = {
    wxid: raw.wx_id,
    hostname: raw.hostname,
    username: raw.username,
    nickname: raw.nickname,
    avatar: makeHTTPSAvatar(raw.avatar),
    corpid: raw.corp_id,
    corpname: raw.corp_short_name || raw.corp_name || `ID:${raw.corp_id}`,
    acctid: raw.acctid,
  }
  return {
    ...base,
    friendlyName: friendlyQywxName(base, false),
    friendlyFullName: friendlyQywxName(base),
    accountId: raw.user_id,
    accountName: raw.user_account_name ?? `ID:${raw.user_id}`,
    status: raw.Status,
    qrcode: raw.QrCode,
  }
}

/**
 * 企业微信转交消息格式
 */
export interface RawQywxTransfer {
  FromUserId: string
  FromUserName: string
  ToUserId: string
  ToUserName: string
  WxIds: string[]
  WxNames: string[]
}

export interface QywxTransfer {
  fromAccountId: string // 转交者用户 ID，如 internal-99（转交者为自己，代表是自己转交给别人；转交者不是自己，代表是别人转交给自己）
  fromName: string // 转交者名称
  toAccountId: string // 接收者用户 ID
  toName: string // 接收者名称
  qywxs: {
    wxid: string
    name: string
  }[]
}

export function formatQywxTransfer(raw: RawQywxTransfer): QywxTransfer {
  return {
    fromAccountId: raw.FromUserId,
    fromName: raw.FromUserName,
    toAccountId: raw.ToUserId,
    toName: raw.ToUserName,
    qywxs: raw.WxIds.map((wxid, index) => ({ wxid, name: raw.WxNames[index]! })),
  }
}

/**
 * 二次扫码信息
 */
export interface RescanInfo {
  wxid: string
  name: string // 企微名称
  avatar: string // 企微头像
  qrcode: string // 二维码
  limit: Dayjs // 扫码截止时间
}
